# -*- coding: utf-8 -*-

# 类中dict作为参数时候的注意事项

class a(object):
    
    def __init__(self, d: dict = {}):
        '''
        | 按这种方式对字典参数复制默认值可能出问题
        | 原因是python实例之间会共享默认参数，
        | 当一个实例修改了默认参数之后，
        | 可能导致新实例的默认参数也变了
        
        Examples
        --------
        >>> # 第一种写法，y.d符合预期
        >>> x = a({1:2})
        >>> y = a()
        >>> print('x.d:', x.d, 'y.d:', y.d)
        x.d: {1: 2} y.d: {}
        >>> # 第二种写法，y.d符合预期
        >>> x = a()
        >>> x.d = {1: 2}
        >>> y = a()
        >>> print('x.d:', x.d, 'y.d:', y.d)
        x.d: {1: 2} y.d: {}
        >>> # 第三种写法，y.d不符合预期
        >>> x = a()
        >>> x.d[1] = 2
        >>> y = a()
        >>> print('x.d:', x.d, 'y.d:', y.d)
        x.d: {1: 2} y.d: {1: 2}
        '''
        self.d = d
        
        
class b(object):
    
    def __init__(self, d: dict = None):        
        '''
        按这种方式对字典参数复制默认值不会出问题
        
        Examples
        --------
        >>> # 第一种写法，y.d符合预期
        >>> x = b({1:2})
        >>> y = b()
        >>> print('x.d:', x.d, 'y.d:', y.d)
        x.d: {1: 2} y.d: {}
        >>> # 第二种写法，y.d符合预期
        >>> x = b()
        >>> x.d = {1: 2}
        >>> y = b()
        >>> print('x.d:', x.d, 'y.d:', y.d)
        x.d: {1: 2} y.d: {}
        >>> # 第三种写法，y.d符合预期
        >>> x = b()
        >>> x.d[1] = 2
        >>> y = b()
        >>> print('x.d:', x.d, 'y.d:', y.d)
        x.d: {1: 2} y.d: {1: 2}
        '''
        
        self.d = {} if d is None else d